#include "GeneradorBonus.h"

int getNumeroRandom(int lowest, int highest){
	srand((unsigned)time(0)); 
	int random_integer; 
	int range=(highest-lowest)+1;

	for(int index=0; index<20; index++)
	{ 
		random_integer = lowest+int(range*rand()/(RAND_MAX + 1.0)); 
	}
	return random_integer;
}

void GeneradorBonus::calcularPolos(double margen){

	vector<Elemento*> listaElementos = this->escenario->getListaElementos();

	vector<Elemento*>::iterator itElementos;
	string aux;
	double arriba = 0, abajo = 0, izquierda = 0, derecha = 0;
	
	for (itElementos=listaElementos.begin(); itElementos!=listaElementos.end(); ++itElementos)
	{
		aux = typeid(**itElementos).name() ;
		aux.erase(0,6);

		if ( aux == "Carril")
		{
			Carril *carrilAux = dynamic_cast<Carril*>((*itElementos));
			vector<Punto*> listaPuntos = carrilAux->getListaDePuntos();
			vector<Punto*>::iterator itPunto;
			for(itPunto = listaPuntos.begin(); itPunto < listaPuntos.end(); itPunto++)
			{
				//derecha
				if (((*itPunto)->getEste()) > derecha)  
					 derecha = ((*itPunto)->getEste());

				//izq
				if (((*itPunto)->getOeste()) < izquierda)  
					izquierda = ((*itPunto)->getOeste());

				//arriba
				if (((*itPunto)->getNorte()) > arriba)  
					arriba = ((*itPunto)->getNorte());

				//abajo
				if (((*itPunto)->getSur()) < abajo)  
					abajo = ((*itPunto)->getSur());
			}
		}
		else
		{	
			Elemento *unelem = dynamic_cast<Elemento*>((*itElementos));

			//izquierda
			if (((*unelem).getOeste()) < izquierda)  
				izquierda = ((*unelem).getOeste());

			//derecha
			if (((*unelem).getEste()) > derecha)  
				derecha = ((*unelem).getEste());

			//arriba
			if (((*unelem).getNorte()) > arriba)  
				arriba = ((*unelem).getNorte());

			//abajo
			if (((*unelem).getSur()) < abajo)  
				abajo = ((*unelem).getSur());
		}
	}

	this->norte = ceil(arriba + margen);
	this->este = ceil (derecha + margen);
	this->sur = floor(abajo - margen);
	this->oeste = floor (izquierda - margen);
}


GeneradorBonus::GeneradorBonus(Escenario* esc)
{
	this->escenario=esc;
	this->pulsosContador=0;
	this->pulsosDuracionLaser=2000;
	this->pulsosContadorLaser=0;
	this->pulsosEntreBonus=getNumeroRandom(400,700);
//	printf("Tiempo entre bonus %d\n ",this->pulsosEntreBonus);
	this->pulsosDuracionBonus=600;
// printf("Duracion %d\n ",this->pulsosDuracionBonus);
	this->calcularPolos(0);
}

void GeneradorBonus::Generar(ChequeadorColisiones* cc)
{
	pulsosContador = pulsosContador +1;

	if (this->pulsosContadorLaser > 0) pulsosContadorLaser = pulsosContadorLaser +1;

	if (this->pulsosContadorLaser > this->pulsosDuracionLaser) this->escenario->getSapo()->desactivarLaser();
		
	if (this->pulsosEntreBonus == pulsosContador)
	{
		//solo trabajo con bonus de Vida;
		int eleccionBonus=getNumeroRandom(1,5);
	//	cout << "\nseteo bonus ";
	//	cout << eleccionBonus;
		
		switch(eleccionBonus) 
        {
			case 1:
            {
				//bonus de vida
				Bonus* bonus=this->escenario->getBonusVida()->Clonar();
				int oeste=this->getOeste();
				int este=this->getEste();
				int sur=this->getSur();
				int norte=this->getNorte();
				bonus->setPosX(getNumeroRandom(oeste,este));
				bonus->setPosY(getNumeroRandom(sur,norte));

			//	printf("\nPosX: %f ",bonus->getPosX());
			//	printf("\nPosY: %f \n",bonus->getPosY());
			
				bonus->CargarTextura();

				//Le aviso al chequeador de colisiones que hay un bonus en pantalla
				cc->setBonus(bonus);
				this->escenario->setBonusEnPantalla(bonus);
				break;
			}
			case 2:
            {
				//bonus de Puntos
				Bonus* bonus=this->escenario->getBonusPuntos()->Clonar();
				bonus->setPosX(getNumeroRandom(this->getOeste(),this->getEste()));
				bonus->setPosY(getNumeroRandom(this->getSur(),this->getNorte()));

			//	printf("\nPosX: %f ",bonus->getPosX());
			//	printf("\nPosY: %f \n",bonus->getPosY());
			
				bonus->CargarTextura();
				cc->setBonus(bonus);
				this->escenario->setBonusEnPantalla(bonus);
				break;
			}
			case 3:
            {
				//bonus de Retroceso
				Bonus* bonus=this->escenario->getBonusRetroceso()->Clonar();
				bonus->setPosX(-10);//getNumeroRandom(this->getOeste(),this->getEste()));
				bonus->setPosY(-10);//getNumeroRandom(this->getSur(),this->getNorte()));

		//		printf("\nPosX: %f ",bonus->getPosX());
		//		printf("\nPosY: %f \n",bonus->getPosY());
			
				bonus->CargarTextura();
				cc->setBonus(bonus);
				this->escenario->setBonusEnPantalla(bonus);
				break;
			}
			case 4:
            {
				//bonus de Precision
				this->pulsosContadorLaser=1;
				Bonus* bonus=this->escenario->getBonusPrecision()->Clonar();
				bonus->setPosX(getNumeroRandom(this->getOeste(),this->getEste()));
				bonus->setPosY(getNumeroRandom(this->getSur(),this->getNorte()));

			//	printf("\nPosX: %f ",bonus->getPosX());
			//	printf("\nPosY: %f \n",bonus->getPosY());
			
				bonus->CargarTextura();

				cc->setBonus(bonus);
				this->escenario->setBonusEnPantalla(bonus);
				break;
			}
			case 5:
            {
				//bonus de freno
				Bonus* bonus=this->escenario->getBonusFreno()->Clonar();
				bonus->setPosX(getNumeroRandom(this->getOeste(),this->getEste()));
				bonus->setPosY(getNumeroRandom(this->getSur(),this->getNorte()));

			//	printf("\nPosX: %f ",bonus->getPosX());
			//	printf("\nPosY: %f \n",bonus->getPosY());
			
				bonus->CargarTextura();
				cc->setBonus(bonus);
				this->escenario->setBonusEnPantalla(bonus);
				break;
			}
		}
	}		 

	if (pulsosContador == this->pulsosEntreBonus+this->pulsosDuracionBonus)
	{
		pulsosContador=0;
		Bonus* aux=this->escenario->getBonusEnPantalla();
		free(aux);
		this->escenario->setBonusEnPantalla(NULL);
		cc->deleteBonus();
	}
}
